home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / Mark Pilgrim / Jotto ][ 1.2 / source / Shell ƒ / window layer.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-10-30  |  7.3 KB  |  297 lines  |  [TEXT/R*ch]

  1. #include "window layer.h"
  2.  
  3. static    WindowPtr MyNewWindowDispatch(short layer, Boolean useColor,
  4.                 ExtendedWindowPtr storage, const Rect *boundsRect, ConstStr255Param title,
  5.                 short procID, Boolean goAwayFlag, long refCon);
  6. static    void SetFrontWindowInLayer(WindowPtr newWindow, WindowPtr oldFrontWindow,
  7.                 short layer);
  8. static    WindowPtr GetFrontWindowInLayer(short layer);
  9. static    void SetWindowPrevious(WindowPtr window, WindowPtr previousWindow);
  10. static    WindowPtr GetWindowPrevious(WindowPtr window);
  11. static    void SetWindowNext(WindowPtr window, WindowPtr nextWindow);
  12. static    WindowPtr GetWindowNext(WindowPtr window);
  13. static    void SetWindowLayer(WindowPtr window, short layer);
  14. static    short GetWindowLayer(WindowPtr window);
  15. static    pascal void MyHiliteWindow(WindowPtr theWindow, Boolean fHilite);
  16. static    void ActivateWindow(WindowPtr window, Boolean activate);
  17.  
  18. enum    /* window layers */
  19. {
  20.     kFloatLayer=0, kDocumentLayer
  21. };
  22.  
  23. #define NUM_LAYERS        2
  24. #define kMagicNumber    0x16435934
  25.  
  26. static    WindowPtr            gFrontWindowInLayer[NUM_LAYERS];
  27. static    UniversalProcPtr    gOldHiliteRoutine;
  28.  
  29. Boolean            gIgnoreNextActivateEvent;
  30.  
  31. void InitTheWindowLayer(void)
  32. {
  33.     short            i;
  34.     
  35.     for (i=0; i<NUM_LAYERS; i++)
  36.         gFrontWindowInLayer[i]=0L;
  37.     
  38.     InstallHilitePatch();
  39.     gIgnoreNextActivateEvent=FALSE;
  40. }
  41.  
  42. void ShutDownTheWindowLayer(void)
  43. {
  44. // well, no
  45. }
  46.  
  47. WindowPtr MyNewWindow(void *wStorage, const Rect *boundsRect, ConstStr255Param title,
  48.     Boolean visible, short procID, WindowPtr behind, Boolean goAwayFlag, long refCon)
  49. {
  50.     return MyNewWindowDispatch(kDocumentLayer, FALSE, (ExtendedWindowPtr)wStorage, boundsRect,
  51.         title, procID, goAwayFlag, refCon);
  52. }
  53.  
  54. WindowPtr MyNewCWindow(void *wStorage, const Rect *boundsRect, ConstStr255Param title,
  55.     Boolean visible, short procID, WindowPtr behind, Boolean goAwayFlag, long refCon)
  56. {
  57.     return MyNewWindowDispatch(kDocumentLayer, TRUE, (ExtendedWindowPtr)wStorage, boundsRect,
  58.         title, procID, goAwayFlag, refCon);
  59. }
  60.  
  61. WindowPtr MyNewFloatWindow(void *wStorage, const Rect *boundsRect, ConstStr255Param title,
  62.     Boolean visible, short procID, WindowPtr behind, Boolean goAwayFlag, long refCon)
  63. {
  64.     return MyNewWindowDispatch(kFloatLayer, FALSE, (ExtendedWindowPtr)wStorage, boundsRect,
  65.         title, procID, goAwayFlag, refCon);
  66. }
  67.  
  68. WindowPtr MyNewFloatCWindow(void *wStorage, const Rect *boundsRect, ConstStr255Param title,
  69.     Boolean visible, short procID, WindowPtr behind, Boolean goAwayFlag, long refCon)
  70. {
  71.     return MyNewWindowDispatch(kFloatLayer, TRUE, (ExtendedWindowPtr)wStorage, boundsRect,
  72.         title, procID, goAwayFlag, refCon);
  73. }
  74.  
  75. WindowPtr MyNewWindowDispatch(short layer, Boolean useColor,
  76.     ExtendedWindowPtr storage, const Rect *boundsRect, ConstStr255Param title, short procID,
  77.     Boolean goAwayFlag, long refCon)
  78. {
  79.     WindowPtr            window;
  80.     WindowPtr            oldFrontWindow;
  81.     WindowPtr            behind;
  82.     WindowPtr            iter, nextIter;
  83.     
  84.     behind=(WindowPtr)-1L;
  85.     if (layer==kDocumentLayer)
  86.     {
  87.         iter=GetFrontWindowInLayer(kFloatLayer);
  88.         if (iter!=0L)
  89.         {
  90.             while ((nextIter=GetWindowNext(iter))!=0L)
  91.                 iter=nextIter;
  92.             behind=iter;
  93.         }
  94.     }
  95.     
  96.     window=useColor ?
  97.             NewCWindow(storage, boundsRect, title, TRUE, procID, behind, goAwayFlag, refCon) :
  98.             NewWindow(storage, boundsRect, title, TRUE, procID, behind, goAwayFlag, refCon);
  99.     
  100.     oldFrontWindow=GetFrontWindowInLayer(layer);
  101.     RemoveHilitePatch();
  102.     if ((layer==kDocumentLayer) && (oldFrontWindow!=0L))
  103.         HiliteWindow(oldFrontWindow, FALSE);
  104.     HiliteWindow(window, TRUE);
  105.     InstallHilitePatch();
  106.     
  107.     if ((layer==kFloatLayer) && (GetFrontDocumentWindow()!=0L))
  108.         gIgnoreNextActivateEvent=TRUE;
  109.     
  110.     storage->magic=kMagicNumber;        /* so we know it's one of ours */
  111.     SetWindowLayer(window, layer);
  112.     SetFrontWindowInLayer(window, oldFrontWindow, layer);
  113.     
  114.     return window;
  115. }
  116.  
  117. void MyDisposeWindow(WindowPtr window)
  118. {
  119.     WindowPtr        newFrontWindow;
  120.     short            layer;
  121.     
  122.     if (WindowHasLayer(window))
  123.     {
  124.         layer=GetWindowLayer(window);
  125.         newFrontWindow=GetWindowNext(window);
  126.         if (newFrontWindow!=0L)
  127.             SetWindowPrevious(newFrontWindow, 0L);
  128.         gFrontWindowInLayer[layer]=newFrontWindow;
  129.         CloseWindow(window);
  130.         DisposePtr((Ptr)window);
  131.         window=0L;
  132.         if (newFrontWindow!=0L)
  133.         {
  134.             RemoveHilitePatch();
  135.             HiliteWindow(newFrontWindow, TRUE);
  136.             InstallHilitePatch();
  137.         }
  138.     }
  139.     else
  140.     {
  141.         DisposeWindow(window);
  142.     }
  143. }
  144.  
  145. Boolean MySelectWindow(WindowPtr window)
  146. {
  147.     WindowPtr        nextWindow, previousWindow, oldFrontWindow;
  148.     short            layer;
  149.     WindowPtr        iter, nextIter;
  150.     
  151.     if (WindowHasLayer(window))
  152.     {
  153.         layer=GetWindowLayer(window);
  154.         oldFrontWindow=GetFrontWindowInLayer(layer);
  155.         if (oldFrontWindow!=window)
  156.         {
  157.             nextWindow=GetWindowNext(window);            /* might be 0L */
  158.             previousWindow=GetWindowPrevious(window);    /* guaranteed !=0L */
  159.             SetWindowNext(previousWindow, nextWindow);
  160.             if (nextWindow!=0L)
  161.                 SetWindowPrevious(nextWindow, previousWindow);
  162.             SetFrontWindowInLayer(window, oldFrontWindow, layer);
  163.         }
  164.         
  165.         if ((layer==kDocumentLayer) && ((iter=GetFrontWindowInLayer(kFloatLayer))!=0L))
  166.         {
  167.             while ((nextIter=GetWindowNext(iter))!=0L)
  168.                 iter=nextIter;
  169.             SendBehind(window, iter);
  170.         }
  171.         else
  172.         {
  173.             SelectWindow(window);
  174.         }
  175.         
  176.         if (oldFrontWindow==window)
  177.             return FALSE;
  178.         
  179.         RemoveHilitePatch();
  180.         if ((layer==kDocumentLayer) && (oldFrontWindow!=0L))
  181.         {
  182.             HiliteWindow(oldFrontWindow, FALSE);
  183.         }
  184.         HiliteWindow(window, TRUE);
  185.         InstallHilitePatch();
  186.     }
  187.     else
  188.     {
  189.         SelectWindow(window);
  190.     }
  191.     
  192.     return TRUE;
  193. }
  194.  
  195. void SetFrontWindowInLayer(WindowPtr newWindow, WindowPtr oldFrontWindow,
  196.     short layer)
  197. {
  198.     if (newWindow!=0L)
  199.         SetWindowNext(newWindow, oldFrontWindow);
  200.     if (oldFrontWindow!=0L)
  201.         SetWindowPrevious(oldFrontWindow, newWindow);
  202.     if (newWindow!=0L)
  203.         SetWindowPrevious(newWindow, 0L);
  204.     gFrontWindowInLayer[layer]=newWindow;
  205. }
  206.  
  207. WindowPtr GetFrontWindowInLayer(short layer)
  208. {
  209.     return gFrontWindowInLayer[layer];
  210. }
  211.  
  212. void SetWindowPrevious(WindowPtr window, WindowPtr previousWindow)
  213. {
  214.     ((ExtendedWindowPtr)window)->previousWindow=previousWindow;
  215. }
  216.  
  217. WindowPtr GetWindowPrevious(WindowPtr window)
  218. {
  219.     return ((ExtendedWindowPtr)window)->previousWindow;
  220. }
  221.  
  222. void SetWindowNext(WindowPtr window, WindowPtr nextWindow)
  223. {
  224.     ((ExtendedWindowPtr)window)->nextWindow=nextWindow;
  225. }
  226.  
  227. WindowPtr GetWindowNext(WindowPtr window)
  228. {
  229.     return ((ExtendedWindowPtr)window)->nextWindow;
  230. }
  231.  
  232. void SetWindowLayer(WindowPtr window, short layer)
  233. {
  234.     ((ExtendedWindowPtr)window)->layer=layer;
  235. }
  236.  
  237. short GetWindowLayer(WindowPtr window)
  238. {
  239.     return ((ExtendedWindowPtr)window)->layer;
  240. }
  241.  
  242. Boolean WindowHasLayer(WindowPtr window)
  243. {
  244.     if (window==0L)
  245.         return FALSE;
  246.     else
  247.         return ((ExtendedWindowPtr)window)->magic==kMagicNumber;
  248. }
  249.  
  250. Boolean WindowIsFloat(WindowPtr window)
  251. {
  252.     if (window==0L)
  253.         return FALSE;
  254.     else
  255.         return ((ExtendedWindowPtr)window)->layer==kFloatLayer;
  256. }
  257.  
  258. WindowPtr GetFrontDocumentWindow(void)
  259. {
  260.     return GetFrontWindowInLayer(kDocumentLayer);
  261. }
  262.  
  263. WindowPtr GetIndWindowPtr(short index)
  264. {
  265.     WindowPtr        w;
  266.     short            i;
  267.     
  268.     for (i=NUM_LAYERS-1; i>=0; i--)
  269.     {
  270.         w=GetFrontWindowInLayer(i);
  271.         while ((w!=0L) && (GetWindowIndex(w)!=index))
  272.             w=GetWindowNext(w);
  273.         if (w!=0L)
  274.             return w;
  275.     }
  276.     
  277.     return 0L;
  278. }
  279.  
  280. void InstallHilitePatch(void)
  281. {
  282.     UniversalProcPtr    newAddress;
  283.     
  284.     gOldHiliteRoutine=GetToolTrapAddress(_HiliteWindow);
  285.     newAddress=(UniversalProcPtr)StripAddress(MyHiliteWindow);
  286.     SetToolTrapAddress(newAddress, (short)_HiliteWindow);
  287. }
  288.  
  289. void RemoveHilitePatch(void)
  290. {
  291.     SetToolTrapAddress(gOldHiliteRoutine, (short)_HiliteWindow);
  292. }
  293.  
  294. pascal void MyHiliteWindow(WindowPtr theWindow, Boolean fHilite)
  295. {
  296. }
  297.